import { AudioClip, AudioSource, assetManager, game } from 'cc';
import { LoadItem } from '../declarations';
import { Dictionary } from '../../../../wing/assets/src';
import { app } from '../application';

/**
 * - 作者: DoooReyn
 * - 日期: 2023.10.31
 * - 名称: 音效播放组件
 */
export class AudioEffect extends AudioSource {
    /** 缓存 */
    private __cache: Dictionary<AudioClip>;

    constructor() {
        super();
        this.__cache = new Dictionary();
    }

    /**
     * 加载音效
     * @param options 选项
     * @param options.cache 是否需要缓存（默认缓存）
     */
    async load(options: LoadItem<AudioClip> & { cache?: boolean }) {
        options.cache ??= true;
        options.bundle ??= 'resources';

        const clip = this.__cache.fetch(options.path) || (await app.resLoader.loadOne(options));
        if (clip) {
            this.playOneShot(clip);
            if (options.cache) {
                // 添加到缓存
                this.__cache.add(options.path, clip);
            } else {
                // 不需要缓存的要及时释放
                const after = clip.getDuration() + game.frameTime / 1000;
                this.scheduleOnce(() => assetManager.releaseAsset(clip), after);
            }
        }
    }

    /** 释放资源 */
    release() {
        this.stop();
        this.__cache.each((_, clip) => assetManager.releaseAsset(clip));
        this.__cache.clear();
    }
}
